package com.dahafo.boot.ehcache.aspect;



import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;


import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;


@Aspect
@Component
public class WebLogAspect {

    private final static Logger logger= LoggerFactory.getLogger(WebLogAspect.class);

    ThreadLocal<Long> startTime=new ThreadLocal<>();

    @Pointcut("execution(public * com.dahafo.boot.ehcache.web..*.*(..))")
    @Order(0)
    public void webLog(){}

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint){
        startTime.set(System.currentTimeMillis());
        logger.info("Aop starter ...");
        ServletRequestAttributes attributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request=attributes.getRequest();
        logger.info("URL: "+ request.getRequestURL().toString());
        logger.info("HTTP_METHOD:" +request.getMethod());
        logger.info("IP: " +request.getRemoteAddr());
        logger.info("CLASS_METHOD: " +joinPoint.getSignature().getDeclaringTypeName()+"."
                +joinPoint.getSignature().getName());
        logger.info("ARGS: " + Arrays.toString(joinPoint.getArgs()));
    }

    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret){
        logger.info("response: " +ret);
        logger.info("spend time: "+ (System.currentTimeMillis()-startTime.get()));
    }


}
